package v1

import (
	"strconv"
	"wms/internal/model/request"
	"wms/internal/service"
	"wms/pkg/common"
	"wms/pkg/logger"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// RoleController 角色控制器
type RoleController struct {
	roleService *service.RoleService
}

// NewRoleController 创建角色控制器
func NewRoleController() *RoleController {
	return &RoleController{
		roleService: service.NewRoleService(),
	}
}

// GetRoleList godoc
// @Summary 获取角色列表
// @Description 获取系统角色列表
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Success 200 {object} resp.Response{data=[]model.Role} "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles [get]
func (c *RoleController) GetRoleList(ctx *gin.Context) {
	var req request.RoleListRequest
	if err := ctx.ShouldBindQuery(&req); err != nil {
		logger.Warn("绑定角色列表请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	roles, total, err := c.roleService.ListRoles(&req)
	if err != nil {
		logger.Error("获取角色列表失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, gin.H{
		"list":  roles,
		"total": total,
	})
}

// GetRoleDetail godoc
// @Summary 获取角色详情
// @Description 获取指定角色的详细信息
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "角色ID"
// @Success 200 {object} resp.Response{data=model.Role} "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles/{id} [get]
func (c *RoleController) GetRoleDetail(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		logger.Warn("解析角色ID失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	role, err := c.roleService.GetRoleByID(uint(id))
	if err != nil {
		logger.Error("获取角色详情失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, role)
}

// CreateRole godoc
// @Summary 创建角色
// @Description 创建新的系统角色
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Param request body request.RoleCreateRequest true "角色信息"
// @Success 200 {object} resp.Response "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles [post]
func (c *RoleController) CreateRole(ctx *gin.Context) {
	var req request.RoleCreateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		logger.Warn("绑定创建角色请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	if err := c.roleService.CreateRole(&req); err != nil {
		logger.Error("创建角色失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}

// UpdateRole godoc
// @Summary 更新角色
// @Description 更新指定角色的信息
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "角色ID"
// @Param request body request.RoleUpdateRequest true "角色信息"
// @Success 200 {object} resp.Response "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles/{id} [put]
func (c *RoleController) UpdateRole(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		logger.Warn("解析角色ID失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	var req request.RoleUpdateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		logger.Warn("绑定更新角色请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	req.ID = uint(id)
	if err := c.roleService.UpdateRole(&req); err != nil {
		logger.Error("更新角色失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}

// DeleteRole godoc
// @Summary 删除角色
// @Description 删除指定的角色
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "角色ID"
// @Success 200 {object} resp.Response "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles/{id} [delete]
func (c *RoleController) DeleteRole(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		logger.Warn("解析角色ID失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	if err := c.roleService.DeleteRole(uint(id)); err != nil {
		logger.Error("删除角色失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}

// GetRolePermissions godoc
// @Summary 获取角色权限
// @Description 获取指定角色的权限列表
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "角色ID"
// @Success 200 {object} resp.Response{data=[]uint} "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles/{id}/permissions [get]
func (c *RoleController) GetRolePermissions(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		logger.Warn("解析角色ID失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	permissions, err := c.roleService.GetRolePermissions(uint(id))
	if err != nil {
		logger.Error("获取角色权限失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, permissions)
}

// UpdateRolePermissions godoc
// @Summary 更新角色权限
// @Description 更新指定角色的权限列表
// @Tags 角色管理
// @Accept json
// @Produce json
// @Security Bearer
// @Param id path int true "角色ID"
// @Param request body request.RolePermissionUpdateRequest true "权限信息"
// @Success 200 {object} resp.Response "成功"
// @Failure 400 {object} resp.Response "请求错误"
// @Failure 500 {object} resp.Response "内部错误"
// @Router /roles/{id}/permissions [put]
func (c *RoleController) UpdateRolePermissions(ctx *gin.Context) {
	id, err := strconv.ParseUint(ctx.Param("id"), 10, 32)
	if err != nil {
		logger.Warn("解析角色ID失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	var req request.RolePermissionUpdateRequest
	if err := ctx.ShouldBindJSON(&req); err != nil {
		logger.Warn("绑定更新角色权限请求参数失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	if err := c.roleService.UpdateRolePermissions(uint(id), req.MenuIDs); err != nil {
		logger.Error("更新角色权限失败", zap.Error(err))
		common.Error(ctx, err)
		return
	}

	common.Success(ctx, nil)
}
